//引入cluster模块
//cluster 模块允许简单容易的创建共享服务器端口的子进程
const cluster = require('cluster');
const http = require('http');

//当该进程是主进程时返回true
if (cluster.isMaster) {

    let numReqs = 0;
    //每秒输出0
    setInterval(() => {
        console.log(`numReqs = ${numReqs}`);
    }, 1000);

    function messageHandler(msg) {
        if (msg.cmd && msg.cmd === 'notifyRequest') {
            numReqs += 1;
        }
    }

    //操作系统的方法
    //os.cpus() 方法返回一个对象数组, 包含每个逻辑 CPU 内核的信息.
    const numCPUs = require('os').cpus().length;
    //8
    console.log(numCPUs);

    for (let i = 0; i < numCPUs; i++) {
        //当新的工作进程被fork时，cluster模块将触发'fork'事件。
        // 可以被用来记录工作进程活动，产生一个自定义的timeout。
        cluster.fork();
    }
    //这是一个哈希表，储存了活跃的工作进程对象，id作为key。有了它，
    //可以方便地遍历所有工作进程。只能在主进程中调用。
    for (const id in cluster.workers) {
        console.log(cluster.workers[id])
        cluster.workers[id].on('message', messageHandler);
    }

} else {

    // Worker processes have a http server.
    http.Server((req, res) => {
        res.writeHead(200);
        res.end('hello world\n');

        process.send({ cmd: 'notifyRequest' });
    }).listen(8000);
}